#ifndef XOR_STR_H
#define XOR_STR_H
#undef KEY
#undef BUFLEN

#define nand(A,B) ((~A) & (~B))
#define nnot(A) (nand(A,A))
#define nor(A,B) (nand((nand(A,B),nand(A,B)))
#define nxor(A,B) nand(nand(nand(A,A),nand(B,B)),nand(A,B))

template <int XORSTART, int BUFLEN, int XREFKILLER>
class XorStr
{
private: 
	XorStr();
public: 
	char s[BUFLEN];

	XorStr(const char* xs)
	{
		int xvalue = XORSTART;
		int i = 0;
		for(;i<(BUFLEN-1);i++) {
			s[i] = nxor(xs[i-XREFKILLER], xvalue);
			xvalue += 1;
			xvalue %= 256;
		}
		s[BUFLEN-1] = 0;
	}
#ifndef DEBUG_OPTION
	~XorStr(){ for(int i=0;i<BUFLEN;i++)s[i]=0;} 
#endif
};


#endif
